
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <iostream>
#include "Task.hpp"
#include "Tool.hpp"

int main()         
{
    //把任务都push进工具箱
    Tool tool;
    tool.PushFunc(DownLoad);
    tool.PushFunc(PrintLog);
    tool.PushFunc(FlushData);

    pid_t id = fork();
    if(id == 0)
    {
        //子进程      
        int i = 3;
        while(i--)
        {       
            printf("子进程pid: %d\n", getpid());
            sleep(1);
        }
        exit(100);                                                                                                                                                             
    }                
    //父进程
    while(1)
    {
        pid_t wid = waitpid(id, NULL, WNOHANG);
        if(wid > 0)
        {
            printf("wait success!\n");         
            break; 
        }
        else if(wid == 0)             
        {         
            printf("child no quit\n");
            //父进程做其他事情
            tool.Execute();
            sleep(1);    
        }
        else if(wid < 0)              
        {            
            printf("wait error\n");
            break;      
        }
    }                              
    return 0;
}



//#include <stdio.h>
//#include <unistd.h>
//#include <stdlib.h>
//#include <sys/types.h>
//#include <sys/wait.h>
//#include <iostream>
//#include <vector>
//#include <string.h>

//#define N 10
//
//int main()
//{
//    std::vector<int> subids;
//    //创建10个子进程
//    int i = 0;
//    for(i; i < N; i++)
//    {
//        pid_t id = fork();
//        if(id == 0)
//        {
//            //子进程
//            int i = 3;
//            while(i--)
//            {
//                printf("我是子进程，pid: %d, ppid: %d, count: %d\n", getpid(), getppid(), i);
//                sleep(1);
//            }
//            printf("子进程退出了\n");
//            //模拟子进程结果不正确
//            int ret = 0;
//            if(ret == 0)
//            {
//                exit(0);
//            }
//            else
//            {
//                exit(1);
//            }
//        }
//        //把所有子进程pid都存入subids
//        subids.push_back(id);
//    }
//    //子进程已退出，下面代码由父进程独享
//    sleep(5);
//    for(auto& wid : subids)
//    {
//        printf("父进程等待特定子进程，子进程pid: %d\n", wid);
//        int status = 0;
//        pid_t rid = waitpid(wid, &status, 0); //等待任意一个进程，阻塞等待
//        if(rid > 0)
//        {
//            int exit_code, exit_signal;
//            exit_code = (status >> 8) & 0xFF;
//            exit_signal = status & 0x7F;
//            if(exit_code == 0 && exit_signal == 0)
//            {
//                printf("子进程运行成功，结果正确\n");
//            }
//            else if(exit_code != 0 && exit_signal == 0)
//            {
//                printf("子进程运行成功，结果不正确：%s\n", strerror(exit_code));
//            }
//            else{
//                printf("子进程运行异常，退出信号：%d\n", exit_signal);
//            }
//        }
//        else{
//            printf("waitpid error!\n");
//        }
//    }
//    sleep(2);
//    return 0;
//}



//int main()
//{
//    printf("hello world\n");
//
//    sleep(1);
//
//    return 1;
//}
